package hyl.base.flow.chart;

import java.math.BigDecimal;
import hyl.core.MyFun;
import hyl.core.data.IMap;

public abstract class AAttribute implements IAttribute {
	/**
	 * 属性集合 用来存放前一个work 输出结果
	 * 
	 * 也可以用来存放 特殊键值
	 */

	protected IMap<String, Object> _props = null;
	// 唯一编号
	protected String id;
	@Override
	public String getId() {
		return id;
	}

	public boolean hasAttr(String 属性, Object 值) {
		return MyFun.compare(_props.get(属性), 值) == 0;
	}

	public boolean hasAttr(String 属性) {
		return _props.containsKey(属性);
	}

	@Override
	public boolean hasAttrs(String... 属性集) {
		for (String 属性 : 属性集) {
			if (!_props.containsKey(属性))
				return false;
		}
		return true;
	}

	public void putAttr(String 属性, Object 值) {
		this._props.put(属性, 值);

	}

	public void addAttr(String 属性) {
		this._props.put(属性, true);
	}

	public void delAttr(String 属性) {
		this._props.remove(属性);
	}

	public int getAttrInt(String 属性) {
		return MyFun.obj2Int(_props.get(属性));
	}

	public long getAttrLong(String 属性) {
		return MyFun.obj2Long(_props.get(属性));
	}

	public String getAttrString(String 属性) {
		return MyFun.obj2Str(_props.get(属性));
	}
	public BigDecimal getAttrDecimal(String 属性) {
		return MyFun.obj2Decimal(_props.get(属性));
	}
	public byte[] getAttrBytes(String 属性) {
		return MyFun.obj2Bytes(_props.get(属性));
	}
	public Number getAttrNum(String 属性) {
		return MyFun.obj2Num(_props.get(属性));
	}
	public boolean getAttrBool(String 属性) {
		return MyFun.obj2Bool(_props.get(属性));
	}
	public char getAttrChar(String 属性) {
		return MyFun.obj2Char(_props.get(属性));
	}
	public synchronized int decAttr(String 属性) {
		int i = MyFun.obj2Int(_props.get(属性));
		i--;
		_props.put(属性, i);
		return i;
	}

	public synchronized int incAttr(String 属性) {
		int i = MyFun.obj2Int(_props.get(属性));
		i++;
		_props.put(属性, i);
		return i;
	}

	public void clearAttr() {
		_props.clear();
	}

	public Object getAttr(String 属性) {
		return _props.get(属性);
	}

	public IMap<String, Object> getAttrs() {
		return _props;
	}

}
